package com.cskaoyan.javase.oop1._11static._1basic;

/**
 * 引例
 * 宠物公司新进了一批同样颜色的猫，创建一个类描述这批宠物
 * 注：创建该类时，给出一个静态成员变量和一个静态成员方法。
 *
 * 随着类加载完毕，静态成员就存在，并且能够使用了！
 *      1.静态成员变量在类加载过程中完成默认初始化具有默认值
 *          然后进行一些其它赋值，类加载结束就可以访问了。
 *          静态成员变量的赋值也是先进行默认初始化，然后考虑其它赋值手段。
 *      2.静态成员方法的二进制指令集合在类加载过程也准备完毕，可以调用了。
 *
 * 延伸思考:
 *      1.如果直接访问类的静态成员,可以不类加载吗?
 *          不可用,实际上,访问类的静态成员是一种触发类加载的时机
 *          类加载的时机: 必须类加载某个类的场景,现在有三种了
 *              a.new对象
 *              b.启动main方法
 *              c.访问类的静态成员
 *          只要访问类的静态成员,会先完成类加载,然后再去做访问操作.
 *
 *      2.类加载某个类最多只有一次,所以静态成员变量在整个类的全局只有一份
 *          且被全体对象共享,属于类
 *          而且它们在类加载过程中的赋值也只有一次
 *
 *
 * 注意事项:
 *      1.类加载过程中,JVM会把那些在类加载过程中会执行的代码封装成一个方法执行
 *          就是在debug模式下看到的clinit方法栈帧.
 *          (了解即可)
 *      2.静态成员变量的赋值，目前你已经知道的，在类加载时期的两种赋值方式：
 *          默认初始化，具有默认值。
 *          显式赋值，声明时直接给出取值。
 *          默认初始化也是永远的第一步，然后才会进行其它赋值方式。
 *
 *      3.一定要注意：
 *          静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 *          静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 *          静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 *
 *          调用类的静态成员方法,触发该类的类加载
 *              类加载完毕,才去调用这个方法
 *          既然是方法，肯定遵循不调用就不执行的原则！
 *
 * @since 10:01
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*Cat c = new Cat();
        System.out.println(Cat.color);*/
        Cat.work();
    }
}

class Cat {
    static String color = "红色";
    int age;

    public void catchMouse() {
        System.out.println("猫抓🐭");
    }

    public static void work() {
        System.out.println("上班去了!");
    }

    public Cat() {
    }
}
